package com.psytech.app.task.service;

import taskmanager.psytech.com.taskmanagerservice._1.Comment;
import taskmanager.psytech.com.taskmanagerservice._1.Task;
import taskmanager.psytech.com.taskmanagerservice._1.User;
import taskmanager.psytech.com.taskmanagerservice._1.GetCommentsResponse.Comments;
import taskmanager.psytech.com.taskmanagerservice._1.GetTasksResponse.Tasks;
import taskmanager.psytech.com.taskmanagerservice._1.GetUsersResponse.Users;

import com.psytech.app.task.service.exception.BusinessException;
import com.psytech.app.task.service.exception.TechnicalException;

public interface TaskManagerService {

	/**
	 * <ul>
	 * <li>getTasks(user,null) => tâches affectés à l'utilisateur</li>
	 * <li>getTasks(null,task) => tâches correspondantes à l'objet task passé en
	 * paramètre</li>
	 * <li>getTasks(null,null) => toutes les tâches</li>
	 * <li>getTasks(user,task) => tâches affectés à l'utilisateur &
	 * correspondantes à l'objet task passé en paramètre.</li>
	 * </ul>
	 * 
	 * @param user
	 *            can be null
	 * @param task
	 *            can be null
	 * @return Les tâches correspondantes aux paramétres passés (or)
	 * @throws BusinessException
	 * @throws TechnicalException
	 */
	public Tasks getTasks(final User user, final Task task) throws BusinessException, TechnicalException;

	/**
	 * @param user
	 * @return User correspondant au param�tre pass�
	 * @throws BusinessException
	 * @throws TechnicalException
	 */
	public Users getUsers(final User user) throws BusinessException, TechnicalException;

	/**
	 * Insere ou update un utilisateur
	 * 
	 * @param user
	 * @return l'utilisateur tel qu'il est dans le r�f�rentiel
	 * @throws BusinessException
	 * @throws TechnicalException
	 */
	public User saveUser(User user) throws BusinessException, TechnicalException;

	/**
	 * Insere un commentaire
	 * 
	 * @param comment
	 * @return Le commentaire tel qu'il est dans le r�f�rentiel
	 * @throws BusinessException
	 * @throws TechnicalException
	 */
	public Comment createComment(Comment comment) throws BusinessException, TechnicalException;

	/**
	 * Supprime le commentaire pass� en param�tre. N�cessite l'uid.
	 * 
	 * @param comment
	 * @throws BusinessException
	 * @throws TechnicalException
	 */
	public void deleteComment(Comment comment) throws BusinessException, TechnicalException;

	/**
	 * @param task
	 * @return la t�che telle qu'elle est dans le r�f�rentiel
	 * @throws BusinessException
	 * @throws TechnicalException
	 */
	public Task saveTask(Task task) throws BusinessException, TechnicalException;

	/**
	 * Supprime la t�che dans le r�f�rentiel
	 * 
	 * @param task
	 * @throws BusinessException
	 * @throws TechnicalException
	 */
	public void deleteTask(Task task) throws BusinessException, TechnicalException;

	/**
	 * Tous les commetaires associ�s � la t�che
	 * 
	 * @param task
	 * @return
	 * @throws BusinessException
	 * @throws TechnicalException
	 */
	public Comments getComments(Task task) throws BusinessException, TechnicalException;

	/**
	 * Supprime l'utilisateur du r�f�rentiel
	 * 
	 * @param user
	 */
	public void deleteUser(User user);
}
